Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Starejši - zbirka nalog...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - Parsons...
Tekmovanja - popravi
rtk 1988
rtk 1996
rtk 1998
rtk 1999
rtk 2000
rtk 2001
rtk 2002
rtk 2004
rtk 2006
rtk 2007
rtk 2008
rtk 2009
rtk 2013
rtk 2014
rtk 2016
rtk 2017
rtk 2018
rtk 2017

rtk 2017


2017.1.1

Zaokrožanje temperature

1. podnaloga

Leta 1966 so pri ameriškem zveznem koordinatorju za meteorologijo ugotovili, da meteorologi po državi v svojih poročilih ne zaokrožajo odčitanih temperatur na cele stopinje vsi na enak način, zato so izdelali priporočilo, ki določa, kako je treba odčitek (realno število) zaokrožiti na najbližje celo število.

Pri tem naj se vrednost, ki je točno na sredini med dvema celima številoma, zaokroži vedno navzgor (t.j. proti višji temperaturi, to velja tudi za negativne odčitke). Tako se npr. vrednost $1.5$ zaokroži na $2$, vrednost $-1.5$ pa na $-1$.

V deželah, kjer merimo temperaturo v stopinjah Celzija (kjer ničla ustreza ledišču vode in so zato meritve blizu ničle pomembne), je v navadi še dodatno pravilo, ki določa, da temperature med $-0.5$ (vključno) in $0$ (izključno) stopinjami sicer zaokrožimo na $0$, a zapišemo kot '-0', torej z negativnim predznakom.

Naloga

Napisana je funkcija zaokrozi(x), ki sprejme realno število $x$. Popravi jo, da bo vnešeno število zaokrožila na celo število upoštevaje obe gornji pravili in ga vrnila kot niz.

def zaokrozi(x):
    temperatura = float(x)
    if temperatura > -0.5 and temperatura <= 0:
        return "-0"
    else:
        desetkrat = int(temperatura * 10)
        if desetkrat % 10 > 5:
            return str(desetkrat // 10)
        else:
            return str(desetkrat // 10)

Vhodni podatki

Število $x$, ki ga je treba zaokrožiti.

Omejitve vhodnih podatkov

$-100. \leq x \leq 100.$

Izhodni podatki

Niz z zaokroženim številom.

Uradna rešitev

def zaokrozi(x):
    """Sprejme število in vrne niz z zaokroženim številom. Vrednosti točno na sredini
    med dvema celima številoma zaokroži navzgor. Če je x med -0.5 vrne '-0'."""
    temperatura = float(x)
    if temperatura >= -0.5 and temperatura < 0:
        return "-0"
    else:
        desetkrat = int(temperatura * 10)
        if desetkrat % 10 >= 5:
            return str(desetkrat // 10 + 1)
        else:
            return str(desetkrat // 10)

2017.1.2

Najlepši esej

1. podnaloga

Ministrstvo za lepobesedje je razpisalo natečaj za najlepše eseje. Pri ocenjevanju esejev je določilo naslednje pravilo: esej je lep, če so v njem vse besede dolge od $3$ do $8$ znakov. Če ne bo nobenega eseja, ki bi zadoščal določenemu pogoju, bo posebna komisija odločala med tistimi eseji, ki imajo najmanj besed krajših od $3$ znakov in daljših od $8$ znakov.

Ministrstvo je najelo programerja, ki bi moral napisati funkcijo oceni(esej), ki prebere en esej in vrne informacijo, ali je esej lep (vse besede so znotraj predpisane dolžine). Če esej ni lep, naj bi vrnila niz z vsebino, koliko besed ima krajših od $3$ znakov in koliko daljših od $8$ znakov, sicer naj bi vrila niz z vsebino, da je esej lep.

Naloga

Programer svojega dela ni dobro opravil. Popravi funkcijo oceni(esej), da bo pravilno delovala.

      def oceni(esej):
          prekratke = 0
          predolge = 0
          with open(esej, 'w', encoding='utf-8') as esej:
              for vrstica in esej:
                  for beseda in re.findall("[A-Za-zČŠŽčšž0-9]+", vrstica):
                      if len(beseda) < 3:
                          prekratke += 1
                      elif len(beseda) > 8:
                          predolge += 1
          if prekratke == 0 and predolge == 0:
              return "Esej je izjemen."
          else:
              return "Esej ni lep: {0} prekratkih, {1} predolgih besed.".format(predolge, prekratke)

Vhodni podatki

Datoteka (npr. esej.txt).

Izhodni podatki

Informacija ali je esej lep ali esej ni lep. Če esej ni lep, vrnjen niz vsebuje tudi število prekratkih ter število predolgih besed. Zgleduj se po spodnjih dveh primerih.

Primer za lep esej:

>>> oceni('esej.txt')
Esej je lep.

Primer za esej, ki ni lep in vsebuje $12$ prekratkih in $7$ predolgih besed: >>> oceni('esej.txt') Esej ni lep: 12 prekratkih, 7 predolgih besed.

Komentar

Beseda je sestavljena iz malih in velikih črk angleške abecede, to so znaki od "a" do "z" in od "A" do "Z". Med besedami so presledki, vejice, pike in drugi znaki, ki niso črke po angleški abecedi. Beseda je vedno v eni vrstici (besede niso nikoli deljene). Tvoja rešitev naj bere esej iz datoteke. Posamezne vrstice vhodnega besedila so dolge po največ $100$ znakov.

Uradna rešitev

def oceni(esej):
    """Sprejme esej v obliki .txt, ga prebere in določi, če je esej lep."""
    prekratke = 0
    predolge = 0
    with open(esej, 'r', encoding='utf-8') as esej:
        for vrstica in esej:
            for beseda in re.findall("[A-Za-z]+", vrstica):
                if len(beseda) < 3:
                    prekratke += 1
                elif len(beseda) > 8:
                    predolge += 1
    if prekratke == 0 and predolge == 0:
        return "Esej je lep."
    else:
        return "Esej ni lep: {0} prekratkih, {1} predolgih besed.".format(prekratke, predolge)

2017.1.3

Pomanjkanje sendvičev

1. podnaloga

Vodvstvo Caféja Ma$\phi$ja se je odločilo, da lačnim študentom ponudi $6$ tipov sendvičev na študentske bone. Program za robota je že napisan, vendar z napakami. Prosijo te, da jim pomagaš in popraviš program za robota, ki bo prodajal sendviče.

Naloga

Popravi program za robota. Program naj na začetku prebere podatke o trenutni zalogi sendvičev. Nato naj kupce sprašuje po želenih sendvičih in vsakemu sproti postreže, če je sendvič še na zalogi, sicer pa naj izpiše, da ga ni. Program naj se konča, ko kupec zahteva sendvič št. $0$. Na koncu naj program izpiše še podatke o najpopularnejšem sendviču (tistem, ki je bil največkrat zahtevan) in izpiše številke sendvičev, ki jih je bilo premalo. Predpostaviš lahko, da v vhodnih podatkih ni napak (npr. zahtevana številka sendviča je vedno od $0$ do $6$).

N = 6
zaloga = [int(input("Zaloga sendvicev st. %d: "%t)) for t in range(1, N)]
stZahtev = [0] * N
premalo = True
while True:
    t = int(input("Pozdravljeni, kateri sendvic zelite? "))
    if not 1 <= t <= N:
        break
    stZahtev[t-1] += 3
    if stZahtev[t-1] > zaloga[t-1]:
        print("Sendvicev tipa %d nam je zal zmanjkalo. "
              "Vec srece prihodnjic!"%t)
        premalo = False
    else:
        print("Izvolite sendvic st. %d. Dober tek!"%t)
if premalo:
    print("Premalo je bilo sendvicev tipa %s." %
          " ".join(str(t+1) for t in range(N) if stZahtev[t] < zaloga[t]))
najvec = max(stZahtev)
print("Najbolj popularni so sendvici st. %s." % " ".join(str(t+1) for t in range(N) if stZahtev[t] == najvec))

Vhodni podatki

Program prebere zalogo sendvičev. Nato uporabnik vnese število med $0$ in $6$.

Izhodni podatki

Program izpiše, če robot postreže sendvič, ki je na zalogi, sicer izpiše, da sendviča ni na zalogi. Če kupec zahteva sendvič št. $0$, se program konča in izpiše podatke o najpopularnejšem sendviču ter številke sendvičev, ki jih je bilo premalo.

Primer

      'Zaloga sendvicev st. 1:'                                       7
      'Zaloga sendvicev st. 2:'                                       2
      'Zaloga sendvicev st. 3:'                                       1
      'Zaloga sendvicev st. 4:'                                       3
      'Zaloga sendvicev st. 5:'                                       2
      'Zaloga sendvicev st. 6:'                                       4
      'Pozdravljeni, kateri sendvic zelite?'                          1
      'Izvolite sendvic st. 1. Dober tek!'
      'Pozdravljeni, kateri sendvic zelite?'                          3
      'Izvolite sendvic st. 3. Dober tek!'
      'Pozdravljeni, kateri sendvic zelite?'                          5
      'Izvolite sendvic st. 5. Dober tek!'
      'Pozdravljeni, kateri sendvic zelite?'                          3
      'Sendvicev tipa 3 nam je zal zmanjkalo. Vec srece prihodnjic!'
      'Pozdravljeni, kateri sendvic zelite?'                          6
      'Izvolite sendvic st. 6. Dober tek!'
      'Pozdravljeni, kateri sendvic zelite?'                          5
      'Izvolite sendvic st. 5. Dober tek!'
      'Pozdravljeni, kateri sendvic zelite?'                          5
      'Sendvicev tipa 5 nam je zal zmanjkalo. Vec srece prihodnjic!'
      'Pozdravljeni, kateri sendvic zelite?'                          6
      'Izvolite sendvic st. 6. Dober tek!'
      'Pozdravljeni, kateri sendvic zelite?'                          0
      'Premalo je bilo sendvicev st. 3 5.'
      'Najbolj popularni so sendvici st. 5.'

Komentar

Zgornji primer je bil na tekmovanju le za ilustracijo in je program lahko izpis oblikoval tudi malo drugače. Tvoj program naj izpis oblikuje kot je prikazano v primeru.

Uradna rešitev

N = 6
zaloga = [int(input("Zaloga sendvicev st. %d: "%t)) for t in range(1, N+1)]
stZahtev = [0] * N
premalo = False
while True:
    t = int(input("Pozdravljeni, kateri sendvic zelite? "))
    if not 1 <= t <= N:
        break
    stZahtev[t-1] += 1
    if stZahtev[t-1] > zaloga[t-1]:
        print("Sendvicev tipa %d nam je zal zmanjkalo. "
              "Vec srece prihodnjic!"%t)
        premalo = True
    else:
        print("Izvolite sendvic st. %d. Dober tek!"%t)
if premalo:
    print("Premalo je bilo sendvicev tipa %s." %
          " ".join(str(t+1) for t in range(N) if stZahtev[t] > zaloga[t]))
najvec = max(stZahtev)
print("Najbolj popularni so sendvici st. %s." % " ".join(str(t+1) for t in range(N) if stZahtev[t] == najvec))

2017.1.5

Pike za tisočice

1. podnaloga

Pri zapisovanju velikih števil pogosto zaradi preglednosti ločimo skupine treh števk s piko.

Primer
  • $12345$ zapišemo kot "$12.345$",
  • $5379473457$ zapišemo kot "$5.379.473.457$",
  • $9876,01234$ pa zapišemo kot "$9.876,01234$".

Kot vidimo iz zadnjega primera, vrivamo pike le levo od decimalne vejice, desno od nje pa ne.

Naloga

Napisana je funkcija izpis_stevila(s), ki kot parameter dobi niz s, ki predstavlja neko število v desetiškem zapisu. V tem nizu nastopajo le znaki od 0 do 9 in mogoče še decimalna vejica. V funkciji je nekaj napak. Popravi jo, da bo dobljeno število v nizu vrnila s pikami kot je opisano zgoraj.

def izpisStevila(s):
    n = s.find(',')
    if n < 0:
        n = len(s)
    izhodni_niz = 'niz'
    for i in range(len(s)):
        if 0 < i <= n and (n-i) % 3 == 1:
            izhodni_niz += '.'
        izhodni_niz += s[i]
    return izhodni_niz

Vhodni podatki

Niz, ki predstavlja neko število v desetiškem zapisu.

Izhodni podatki

Niz, ki predstavlja število v vhodnem nizu z dodanimi pikami.

Primeri

>>> izpis_stevila('12345')
12.345

>>> izpis_stevila('5379473457')
5.379.473.457

>>> izpis_stevila('9876,01234')
9.876,01234

Uradna rešitev

def izpis_stevila(s):
    """Vrne niz, ki predstavlja število v vhodnem nizu z dodanimi pikami."""
    n = s.find(',')
    if n < 0:
        n = len(s)
    izhodni_niz = ''
    for i in range(len(s)):
        if 0 < i < n and (n - i) % 3 == 0:
            izhodni_niz += '.'
        izhodni_niz += s[i]
    return izhodni_niz
Mesto objave ob koncu projekta 15.9.2018